{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import requests\n",
    "\n",
    "results = []\n",
    "q = \"created:>2017-01-01\"\n",
    "\n",
    "def search_repo_paging(q):\n",
    "    params = {'q' : q, 'sort' : 'forks', 'order': 'desc', 'per_page' : 100}\n",
    "    url = 'https://api.github.com/search/repositories'\n",
    "\n",
    "    while True:\n",
    "\n",
    "        res = requests.get(url, params = params)\n",
    "        result = res.json()\n",
    "        results.extend(result['items'])\n",
    "        params = {}\n",
    "\n",
    "        try:\n",
    "            url = res.links['next']['url']\n",
    "        except:\n",
    "            break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pandas.io.json import json_normalize\n",
    "\n",
    "import json\n",
    "\n",
    "import pandas as pd\n",
    "import bson.json_util as json_util\n",
    "\n",
    "sanitized = json.loads(json_util.dumps(results))\n",
    "normalized = json_normalize(sanitized)\n",
    "df = pd.DataFrame(normalized)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>archive_url</th>\n",
       "      <th>assignees_url</th>\n",
       "      <th>blobs_url</th>\n",
       "      <th>branches_url</th>\n",
       "      <th>clone_url</th>\n",
       "      <th>collaborators_url</th>\n",
       "      <th>comments_url</th>\n",
       "      <th>commits_url</th>\n",
       "      <th>compare_url</th>\n",
       "      <th>contents_url</th>\n",
       "      <th>...</th>\n",
       "      <th>subscribers_url</th>\n",
       "      <th>subscription_url</th>\n",
       "      <th>svn_url</th>\n",
       "      <th>tags_url</th>\n",
       "      <th>teams_url</th>\n",
       "      <th>trees_url</th>\n",
       "      <th>updated_at</th>\n",
       "      <th>url</th>\n",
       "      <th>watchers</th>\n",
       "      <th>watchers_count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://github.com/hasura-imad/imad-app-v2.git</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://github.com/hasura-imad/imad-app-v2</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>2017-05-17T13:02:53Z</td>\n",
       "      <td>https://api.github.com/repos/hasura-imad/imad-...</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://github.com/learn-co-students/js-if-els...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://github.com/learn-co-students/js-if-els...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>2017-04-24T18:46:46Z</td>\n",
       "      <td>https://api.github.com/repos/learn-co-students...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://github.com/SunJieMing/js-minicamp-home...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://github.com/SunJieMing/js-minicamp-home...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>2017-07-12T20:08:57Z</td>\n",
       "      <td>https://api.github.com/repos/SunJieMing/js-min...</td>\n",
       "      <td>15</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://github.com/COGS108/MyFirstPullRequest2...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://github.com/COGS108/MyFirstPullRequest2</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>2017-05-02T01:20:05Z</td>\n",
       "      <td>https://api.github.com/repos/COGS108/MyFirstPu...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://github.com/rolling-scopes-school/doubl...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://github.com/rolling-scopes-school/doubl...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>2017-07-09T12:53:31Z</td>\n",
       "      <td>https://api.github.com/repos/rolling-scopes-sc...</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 86 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                         archive_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                       assignees_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                           blobs_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                        branches_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                           clone_url  \\\n",
       "0     https://github.com/hasura-imad/imad-app-v2.git   \n",
       "1  https://github.com/learn-co-students/js-if-els...   \n",
       "2  https://github.com/SunJieMing/js-minicamp-home...   \n",
       "3  https://github.com/COGS108/MyFirstPullRequest2...   \n",
       "4  https://github.com/rolling-scopes-school/doubl...   \n",
       "\n",
       "                                   collaborators_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                        comments_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                         commits_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                         compare_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                        contents_url       ...        \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...       ...         \n",
       "1  https://api.github.com/repos/learn-co-students...       ...         \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...       ...         \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...       ...         \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...       ...         \n",
       "\n",
       "                                     subscribers_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                    subscription_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                             svn_url  \\\n",
       "0         https://github.com/hasura-imad/imad-app-v2   \n",
       "1  https://github.com/learn-co-students/js-if-els...   \n",
       "2  https://github.com/SunJieMing/js-minicamp-home...   \n",
       "3     https://github.com/COGS108/MyFirstPullRequest2   \n",
       "4  https://github.com/rolling-scopes-school/doubl...   \n",
       "\n",
       "                                            tags_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                           teams_url  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...   \n",
       "1  https://api.github.com/repos/learn-co-students...   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...   \n",
       "\n",
       "                                           trees_url            updated_at  \\\n",
       "0  https://api.github.com/repos/hasura-imad/imad-...  2017-05-17T13:02:53Z   \n",
       "1  https://api.github.com/repos/learn-co-students...  2017-04-24T18:46:46Z   \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...  2017-07-12T20:08:57Z   \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...  2017-05-02T01:20:05Z   \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...  2017-07-09T12:53:31Z   \n",
       "\n",
       "                                                 url  watchers  watchers_count  \n",
       "0  https://api.github.com/repos/hasura-imad/imad-...         2               2  \n",
       "1  https://api.github.com/repos/learn-co-students...         0               0  \n",
       "2  https://api.github.com/repos/SunJieMing/js-min...        15              15  \n",
       "3  https://api.github.com/repos/COGS108/MyFirstPu...         0               0  \n",
       "4  https://api.github.com/repos/rolling-scopes-sc...         3               3  \n",
       "\n",
       "[5 rows x 86 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Processing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.6/site-packages/ipykernel_launcher.py:4: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  after removing the cwd from sys.path.\n"
     ]
    }
   ],
   "source": [
    "from langdetect import detect\n",
    "\n",
    "df = df.dropna(subset=['description'])\n",
    "df['lang'] = df.apply(lambda x: detect(x['description']),axis=1)\n",
    "df = df[df['lang'] == 'en']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nltk, string\n",
    "\n",
    "from nltk import word_tokenize\n",
    "\n",
    "from nltk.corpus import stopwords\n",
    "\n",
    "def clean(text = '', stopwords = []):\n",
    "\n",
    "    #tokenize\n",
    "\n",
    "    tokens = word_tokenize(text.strip())\n",
    "\n",
    "    #lowercase\n",
    "\n",
    "    clean = [i.lower() for i in tokens]\n",
    "\n",
    "    #remove stopwords\n",
    "\n",
    "    clean = [i for i in clean if i not in stopwords]\n",
    "\n",
    "    #remove ponctuation\n",
    "\n",
    "    punctuations = list(string.punctuation)\n",
    "\n",
    "    clean = [i.strip(''.join(punctuations)) for i in clean if i not in\n",
    "\n",
    "    punctuations]\n",
    "\n",
    "    return \" \".join(clean)\n",
    "\n",
    "df['clean'] = df['description'].apply(str) #make sure description is a\n",
    "\n",
    "string\n",
    "\n",
    "df['clean'] = df['clean'].apply(lambda x: clean(text = x, stopwords = stopwords.words('english')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>watchers_count</th>\n",
       "      <th>size</th>\n",
       "      <th>forks_count</th>\n",
       "      <th>open_issues</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>107.000000</td>\n",
       "      <td>107.000000</td>\n",
       "      <td>107.000000</td>\n",
       "      <td>107.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>215.915888</td>\n",
       "      <td>10854.859813</td>\n",
       "      <td>146.542056</td>\n",
       "      <td>9.467290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>450.105671</td>\n",
       "      <td>52309.227403</td>\n",
       "      <td>246.533754</td>\n",
       "      <td>29.419323</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>15.500000</td>\n",
       "      <td>83.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2.000000</td>\n",
       "      <td>91.000000</td>\n",
       "      <td>97.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>199.500000</td>\n",
       "      <td>1939.000000</td>\n",
       "      <td>137.500000</td>\n",
       "      <td>6.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>2217.000000</td>\n",
       "      <td>486038.000000</td>\n",
       "      <td>2563.000000</td>\n",
       "      <td>276.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       watchers_count           size  forks_count  open_issues\n",
       "count      107.000000     107.000000   107.000000   107.000000\n",
       "mean       215.915888   10854.859813   146.542056     9.467290\n",
       "std        450.105671   52309.227403   246.533754    29.419323\n",
       "min          0.000000       0.000000    72.000000     0.000000\n",
       "25%          0.000000      15.500000    83.000000     0.000000\n",
       "50%          2.000000      91.000000    97.000000     1.000000\n",
       "75%        199.500000    1939.000000   137.500000     6.500000\n",
       "max       2217.000000  486038.000000  2563.000000   276.000000"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['watchers_count','size','forks_count','open_issues']].describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Top technologies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import nltk\n",
    "from nltk.collocations import *\n",
    "\n",
    "\n",
    "list_documents = df['clean'].apply(lambda x: x.split()).tolist()\n",
    "\n",
    "bigram_measures = nltk.collocations.BigramAssocMeasures()\n",
    "bigram_finder = BigramCollocationFinder.from_documents(list_documents)\n",
    "bigram_finder.apply_freq_filter(3)\n",
    "\n",
    "bigrams = bigram_finder.nbest(bigram_measures.raw_freq,20)\n",
    "scores = bigram_finder.score_ngrams(bigram_measures.raw_freq)\n",
    "\n",
    "\n",
    "ngram = list(bigram_finder.ngram_fd.items())\n",
    "ngram.sort(key=lambda item: item[-1], reverse=True)\n",
    "\n",
    "frequency = [(\" \".join(k), v) for k,v in ngram]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAE9CAYAAAAGUBjYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xtczvf/x/HHVVcHlc6KcgiJSGyRw5qwMIdvm69tzocZ\nZtqBGr5s5pgkhzGHDY192UYbM8xpmcIYNt9IzjqsRAkJ6Xhdvz/8fLZrxSqu5crrfru53fqc3p/n\n57K5Xr3f7+t6q7RarRYhhBBCiCrEqLIDCCGEEEI8blLgCCGEEKLKkQJHCCGEEFWOFDhCCCGEqHKk\nwBFCCCFElSMFjhBCCCGqHClwhBBCCAM2bdo0Bg0aVNkxHllycjIqlYqioqLH0p4UOEIIIUQ5uLm5\n4eTkxJ07d5R9q1atomPHjpUX6gFiYmJQqVSMGTNGZ7+fnx9r1qwpUxsqlYoLFy7oIZ1+SYEjhBBC\nlFNxcTGLFi3S+30eR2+GpaUla9euJTk5+dED6cnj6rX5MylwhBBCiHIaP3488+bNIzs7u9TjZ86c\noUuXLtjb29O4cWOioqKUYx07dmTVqlXK9po1a/Dz81O2VSoVS5cupVGjRjRq1AiA9957jzp16mBt\nbY2Pjw/79+8vc1ZbW1uGDRvG9OnTH3jO559/jqenJ3Z2dnTr1o2UlBQAOnToAECLFi2wsrJiw4YN\n+Pv7s3HjRgB+/vlnVCoVP/zwAwB79uyhZcuWAGg0GmbNmkW9evVwcnJiyJAh3Lx5E/hjOCoyMpK6\ndevSuXPnEpk2btyIm5sbJ0+eJC8vj0GDBuHg4ICtrS2tW7cmIyPjoc8tBY4QQghRTq1ataJjx47M\nmzevxLE7d+7QpUsXBgwYQGZmJuvXr2fMmDGcOnWqzO1v3ryZw4cPK9e0bt2auLg4rl+/zoABA3j1\n1VfJy8src3sffPABGzdu5OzZsyWOff/998yePZtNmzZx9epVnn/+efr37w/Avn37ADh+/Di3b9+m\nb9+++Pv7ExMTA0BsbCwNGjRQzouNjcXf3x+4V7itWbOGvXv3kpiYyO3bt3n77bd17h0bG8vp06fZ\ntWuXzv7Vq1czceJEoqOj8fLy4osvvuDmzZukpqZy7do1Pv30U6pVq/bQZ5YCRwghhKiAGTNm8Mkn\nn3D16lWd/du2bcPNzY3XX38dtVrNM888Q58+ffjmm2/K3PakSZOwt7dX3sTv916o1WpCQkLIz88v\ntVh5kJo1azJ69Gg++uijEsc+/fRTJk2ahKenJ2q1msmTJxMXF6f04vyVv78/sbGxwL0CaNKkScr2\nnwucL7/8kuDgYBo0aICVlRVhYWGsX79eZzhq2rRpWFpa6hQrH3/8MREREcTExODu7g6AiYkJ165d\n48KFCxgbG+Pj44O1tfVDn1kKHCGEEKICvLy86NWrF3PmzNHZn5KSwuHDh7G1tVX+fPnll1y5cqXM\nbdepU0dne968eXh6emJjY4OtrS03b94kKyurXHknTpzIrl27OH78eIm87733npLV3t4erVbLpUuX\nSm2nXbt2nDt3joyMDOLi4hgyZAipqalkZWVx5MgRZVgrPT2devXqKdfVq1ePoqIinaGlvz4nQERE\nBEFBQdSuXVvZN3jwYLp160a/fv1wcXFhwoQJFBYWPvR5pcARQgghKmj69OmsXLlSpxioU6cO/v7+\nZGdnK39u377N8uXLgXuTfnNzc5XzSyt8VCqV8vP+/fuZO3cuUVFR3Lhxg+zsbGxsbNBqteXK6uDg\nwNixY5kyZYrO/jp16vDZZ5/p5L179y7t27cvtR0LCwt8fHxYtGgRXl5emJqa0r59exYsWEDDhg1x\ndHQEwMXFRacX6Pfff0etVuPs7Fzqc963e/duZs2apczzgXs9OFOnTuXUqVMcPHiQbdu28d///veh\nzysFjhBCCFFB7u7u9O3bl8WLFyv7evXqxblz51i7di2FhYUUFhZy9OhRTp8+DUDLli3ZtGkTubm5\nXLhwgcjIyIfe49atW6jVamrUqEFRUREzZswgJyenQnmDg4M5ePCgkgVg9OjRhIWFkZCQAMDNmzd1\nhtOcnZ1JTEzUacff358lS5Yow1EdO3bU2Qbo378/CxcuJCkpidu3bzN58mT69u2LWq1+aMZmzZqx\nc+dOgoKC2LJlCwB79+4lPj6e4uJirK2tMTExwcjo4SWMFDhCCCHEI/joo490vhOnevXq7N69m/Xr\n1+Pi4kLNmjWZOHEi+fn5AIwbNw5TU1OcnZ0ZOnQoAwcOfGj73bp148UXX8TDw4N69ephbm5e6tBO\nWVhbWzNhwgSuX7+u7OvduzcTJ06kX79+WFtb4+XlxY4dO5Tj06ZNY+jQodja2iqfBvP39+fWrVvK\ncNRftwGGDx/O4MGD6dChA/Xr18fc3JxPPvmkTDlbtGjBtm3bGDlyJDt27ODKlSu88sorWFtb4+np\nib+/P4MHD35oGyptefu4hBBCCCGecNKDI4QQQogqRwocIYQQQlQ5UuAIIYQQosqRAkcIIYQQVY4U\nOEIIIYSocqTAEUIIIUSVIwWOEEIIIaocKXCEEEIIUeVIgSOEEEKIKkcKHCGEEEJUOVLgCCGEEKLK\nkQJHCCGEEFWOFDhCCCGEqHKkwBFCCCFElSMFjhBCCCGqHClwhBBCCFHlSIEjhBBCiCpHChwhhBBC\nVDlS4AghhBCiypECRwghhBBVjhQ4QgghhKhypMARQgghRJUjBY4QQgghqhwpcIQQQghR5UiBI4Qo\noW3btrz99tsP3DZ0mzdvRqVScfv2bb3fKy4uDpVKxcmTJw2iXSGqCnVlBxDiaaVSqR56vF69eiQn\nJ/8zYf7G9u3bMTEx0es9zpw5g6en50PP6datGzt37tRrDkPh5eXF5cuXcXR0rOwoQjyRpMARopJc\nvnxZ+fngwYP06dOHY8eOUatWLQCMjY1Lva6goABTU9N/JON99vb2er9Ho0aNdF6T//73v0yfPp2L\nFy8q+8zMzPSew1Co1Wpq1qxZ2TGEeGLJEJUQlaRmzZrKn/sFRI0aNZR9NWrUUM6bPn06o0aNwt7e\nni5dugCQk5NDUFAQtWrVwtLSklatWrF161al/TNnzqBSqdi0aRPdu3fHwsICd3d3vvrqK50ciYmJ\nBAQEYG5uTr169fjss89KZC1tyCooKIiPPvoIJycnHBwceOONN8jNzVXOKS4uZvz48Tg4OFC9enUG\nDRpEREQEVlZWpb4exsbGOq+JtbU1KpVKZ5+dnR0AN27c4M0336RmzZpYWlri6+vLrl27dNpLTU1l\n4MCBODo6Uq1aNZo2bcqGDRt0zvnf//5HmzZtsLCwwNvbm9jYWOXY/SGgrVu30qVLFywsLPDw8ODb\nb7/VaSM5OZnevXtjbW2NhYUFXbt2JSEhodRnvO/48eMEBARgYWGBjY0Nffr0IS0tTeecVatW4ebm\nRrVq1ejYsSPffvutzpBUaUNUqamp9O/fHwcHB2xsbOjYsSNHjx5Vjt+9e5e33noLFxcXzMzMcHV1\nZdSoUQ/NKoShkgJHCAMwf/583NzcOHz4MJ999hkajYbu3btz9uxZNm7cyIkTJ3j99df597//zYED\nB3SunThxIiNHjuTEiRO8/PLLDBs2TBn60mg0BAYGkpuby/79+/nuu+/4+uuvOXXq1N9m+vLLL8nP\nz2f//v2sXbuWb775hoULFyrHw8PDWbFiBUuWLOG3336jefPmzJ49+5Ffi6KiIrp06cLvv//O5s2b\nOXHiBAMGDKBXr17Km3l2djbPP/88SUlJbNy4kYSEBCIiIkr0fL3//vuEhYURFxdH48aNee2113SK\nNIDx48fz9ttvc+LECV588UUGDRrEpUuXlCw9evTgypUr/Pjjjxw6dAhTU1O6dOnywPk9N2/eVIqb\nQ4cOsWvXLtLS0ujVqxcajQaAn376iVGjRvHmm29y/PhxRo8eTUhIyENfl5s3b/L8889jYmLCnj17\nOHr0KO3ataNTp078/vvvAISFhREdHc0333zD+fPn2bRpEy1atCj/X4IQhkArhKh0e/fu1QLa1NTU\nEsecnZ21PXr00Nm3Y8cOrYWFhfb27ds6+/v376/t27evVqvVak+fPq0FtEuXLlWO5+fna01NTbVr\n1qzRarVa7datW7VGRkbapKQk5ZxLly5pTUxMtEFBQcq+Nm3alNhu3bq1zr2HDRum7dixo7Lt4OCg\nnTVrls45L730ktbS0vKhr8V9y5cvL/Xc7777TmtjY6O9e/euzv7evXtrhw4dqtVqtdp58+Zpra2t\ntVlZWaW2/d1332kB7Z49e5R9Z86c0QLaX375RavVarX/+9//tIA2MjJSOSc3N1drZGSkXb9+vVar\n1Wq//fZbrVqt1qakpCjn3Lx5U2tjY6NdtGiRTjvx8fFKNjs7O+2tW7eUaxITE7VGRkba77//XqvV\narU9evTQ9urVSydzWFiYTjt/bXfhwoXaJk2aaDUajc51zzzzjHbq1KlarVarHTJkiPbll18u9TUR\noqqROThCGABfX1+d7aNHj3L37l2cnZ119hcUFNC8eXOdfS1btlR+NjU1xdHRkYyMDABOnTqFi4sL\nbm5uyjkuLi40aNDgbzP9ud371x0+fBiAjIwMrl27Rtu2bXXOadeuHdHR0X/b9sMcPXqUW7dulZhc\nW1BQQOvWrQH47bff8PHxwcHBoczP4OLiomR/0DnVqlXD1tZWOSchIYF69epRt25d5Rxra2tatmz5\nwGGqhIQEnn32WZ2huvr161OnTh0SEhIIDAzk1KlTjBgxQue6du3aPfRZjh49yvnz56levbrO/ry8\nPGXy9qhRo+jZsydNmjThhRdeoFu3bvTo0QO1Wt4KRNUj/1ULYQAsLS11tjUaDU5OTiWGo6DkRNy/\nDsuoVCplKORRlKXdv/ukWEVoNBpq167Nnj17ShwzNzcvV1t/fob7Wf/6DPp6/f5OeV87jUZDmzZt\n+OKLL0ocu19MPffcc6SkpLB792727t3LyJEjqVu3Lvv37y/3ayfEk07m4AhhgFq1akVmZiZarRZ3\nd3edP3Xq1ClzO02bNiU9PZ2UlBRl3+XLl0lMTHykfM7Ozjg4OHDo0CGd/b/88ssjtQv3nj09PR21\nWl3i2WvXrg2Aj48Pv/32G9euXXvk+z1Ms2bNSElJUea4wL3J33FxcXh5eT3wmmPHjunM0UlKSiI1\nNVW5pmnTpuV+7Vq1asXZs2epUaNGidflz5+2srGx4dVXX2XZsmXExsby66+/6kxEFqKqkAJHCAPU\nvXt3/Pz8CAwMZMuWLSQlJfHrr7/y8ccfs2bNmnK107hxYwYOHMivv/7KsWPHGDhw4GP5OHZwcDAR\nERFs2LCB8+fPM2/ePGJjYx+5V+ell17i2Wef5V//+hc//PADSUlJHD16lPnz5/Pll18CMHz4cKyt\nrQkMDCQ2NpakpCR27drF5s2bH/m5/pqlUaNG9O3bl8OHD3P8+HEGDBiAhYUFr7/+eqnXjBgxAmNj\nYwYMGMDx48c5fPgw/fr1o3nz5vTs2ROAkJAQfvjhB8LDwzl//jxRUVEsX74ceHDPzogRI7CxseFf\n//oXe/fuJTk5mUOHDjF9+nR+/PFHAGbOnElUVBSnT5/m4sWLfPHFF5iZmdGwYcPH+roI8SSQAkcI\nA2RkZMSOHTvo2bMn77zzDo0bN6ZXr17s3r27TPNn7jM2NmbLli2YmZnh5+fHSy+9xKuvvkqzZs0e\nOePEiRMZMWIEb731Fs8++yxxcXG89957jzwUolariY6O5oUXXuCtt96icePGBAYGEhMTQ/369QGw\ns7PjwIED1K5dm969e9O0aVOCg4MpLCx85Of6a5bt27dTs2ZNunTpQrt27SgoKODHH3984MfhbWxs\niI6OJjc3l3bt2tGlSxdq167Ntm3bMDK6909y586d+eyzz1i6dCnNmzdn2bJlzJgxA3jwMJyNjQ0/\n//wz7u7u9O/fHw8PD1577TVOnTql9GxZWloSGhpK69ateeaZZ4iNjWXr1q3K/CMhqhKVVqvVVnYI\nIcTTYcCAAaSkpPDzzz9XdhSDs3jxYiZOnMjNmzf/8S96FMIQySRjIYRepKSksGPHDvz9/VGpVHz3\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11156f5c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df=pd.DataFrame(frequency)\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.style.use('ggplot')\n",
    "\n",
    "df.set_index([0], inplace = True)\n",
    "\n",
    "df.sort_values(by = [1], ascending = False).head(20).plot(kind = 'barh')\n",
    "\n",
    "plt.title('Trending Technologies')\n",
    "\n",
    "plt.ylabel('Technology')\n",
    "\n",
    "plt.xlabel('Popularity')\n",
    "\n",
    "plt.legend().set_visible(False)\n",
    "\n",
    "plt.axvline(x=14, color='b', label='Average', linestyle='--', linewidth=3)\n",
    "\n",
    "for custom in [0, 10, 14]:\n",
    "    plt.text(14.2, custom, \"Neural Networks\", fontsize = 12, va = 'center',bbox = dict(boxstyle='square', fc='white', ec='none'))\n",
    "\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Programming languages"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "'NoneType' object is not subscriptable",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-45-b2aabf58ca1b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      7\u001b[0m     \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msearch_repo_paging\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m     \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjson\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjson_normalize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     11\u001b[0m     \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/usr/local/lib/python3.6/site-packages/pandas/io/json/normalize.py\u001b[0m in \u001b[0;36mjson_normalize\u001b[0;34m(data, record_path, meta, meta_prefix, record_prefix, errors, sep)\u001b[0m\n\u001b[1;32m    181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    182\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mrecord_path\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 183\u001b[0;31m         \u001b[0;32mif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitervalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    184\u001b[0m             \u001b[0;31m# naive normalization, this is idempotent for flat records\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    185\u001b[0m             \u001b[0;31m# and potentially will inflate the data considerably for\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable"
     ]
    }
   ],
   "source": [
    "queries = [\"created:>2017-01-01\", \"created:2015-01-01..2015-12-31\",\"created:2016-01-01..2016-12-31\"]\n",
    "\n",
    "df = pd.DataFrame()\n",
    "\n",
    "for query in queries:\n",
    "\n",
    "    data = search_repo_paging(query)\n",
    "\n",
    "    data = pd.io.json.json_normalize(data)\n",
    "\n",
    "    df = pd.concat([df, data])\n",
    "    \n",
    "df['created_at'] = df['created_at'].apply(pd.to_datetime)\n",
    "\n",
    "df = df.set_index(['created_at'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'Index' object has no attribute 'year'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-42-18b7e6c4cbde>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubplots\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgroupby\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'language'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0myear\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'language'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcount\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mdx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munstack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'bar'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtitle\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Programming Languages per Year'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: 'Index' object has no attribute 'year'"
     ]
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "dx = pd.DataFrame(df.groupby(['language', df.index.year])['language'].count())\n",
    "\n",
    "dx.unstack().plot(kind='bar', title = 'Programming Languages per Year', ax = ax)\n",
    "\n",
    "ax.legend(['2015', '2016', '2017'], title = 'Year')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Programming languages in top technologies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "technologies_list = ['software engineering', 'deep learning', 'open source', 'exercise practice']\n",
    "\n",
    "for tech in technologies_list:\n",
    "\n",
    "    print(tech)\n",
    "\n",
    "    print(set(df[df['clean'].str.contains(tech)]['language']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Top repositories by technology"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "technologies_list = ['software engineering', 'deep learning', 'open source', 'exercise practice']\n",
    "\n",
    "result = df.sort_values(by='watchers_count', ascending=False)\n",
    "\n",
    "for tech in technologies_list:\n",
    "\n",
    "    subset = result[result['clean'].str.contains(tech)].head(5)\n",
    "\n",
    "    print(tech)\n",
    "\n",
    "    for i,line in subset.iterrows():\n",
    "\n",
    "        print(line['name'])\n",
    "\n",
    "        print(line['description'])\n",
    "\n",
    "        print('\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Forks, open_issues, size, watchers count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "df.groupby('technology')['forks', 'watchers', 'size', 'open_issues'].mean()\n",
    "df.groupby('technology')['forks', 'watchers', 'size', 'open_issues'].min()\n",
    "df.groupby('technology')['forks', 'watchers', 'size', 'open_issues'].max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Forks vs open issues"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['forks']\n",
    "\n",
    "y = df['open_issues']\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "colors = dict(zip(set(df['technology']), ['red', 'blue']))\n",
    "\n",
    "ax.scatter(x=x, y=y, c=df['technology'].apply(lambda x: colors[x]), s = 200, alpha = 0.5)\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Number of forks', ylabel='Number of open issues')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Forks vs size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['forks']\n",
    "\n",
    "y = df['size']\n",
    "\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Number of forks', ylabel='Repos size')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Forks vs watchers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['watchers']\n",
    "\n",
    "y = df['forks']\n",
    "\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Number of watchers', ylabel='Number of forks')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Open issues versus size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['open_issues']\n",
    "\n",
    "y = df['size']\n",
    "\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Number of open issues', ylabel='Repos size')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Open issues versus Watchers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['open_issues']\n",
    "\n",
    "y = df['watchers']\n",
    "\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Number of open issues', ylabel='Number of watchers')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Size vs watchers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = df['size']\n",
    "\n",
    "y = df['watchers']\n",
    "\n",
    "ax.set(title='Deep Learning and Open Source Technologies', xlabel='Repos size', ylabel='Number of watchers')\n",
    "       \n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
